﻿#include "configreader.h"
#include <QMessageBox>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QFile>


ConfigReader::ConfigReader(QObject *parent)
    : QObject{parent}
{}

// 读取配置文件的关键配置key列表
QStringList ConfigReader::readFileKeys(const QString& filePath)
{
    // 判断文件是否能打开
    QFile file(filePath);
    this->filePath = filePath;

    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(nullptr, u8"警告", filePath + u8"文件打开失败，请检查文件是否存在！error:" + file.errorString() + QString::number(__LINE__));
        file.close();
        return QStringList();
    }

    // 创建json对象
    QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());

    if (jsonDoc.isNull()) {
        QJsonParseError error;
        QJsonDocument::fromJson(file.readAll(), &error);
        QMessageBox::warning(nullptr, u8"错误", u8"错误: 解析失败位置：" + QString::number(error.offset) + error.errorString());
        file.close();
        return QStringList();
    }

    // 处理 JSON 数据
    QJsonObject jsonObj = jsonDoc.object();

    file.close();

    // 读取并返回configkeys；
   return jsonObj.keys();
}


// 根据key值读取关键配置
void ConfigReader::readConfigByKey(const QString& key)
{
    // 判断文件是否能打开
    QFile file(filePath);

    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(nullptr, u8"警告", filePath + u8"文件打开失败，请检查文件是否存在！error:" + file.errorString() + QString::number(__LINE__));
        file.close();
        return;
    }

    // 创建json对象
    QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());

    if (jsonDoc.isNull()) {
        QJsonParseError error;
        QJsonDocument::fromJson(file.readAll(), &error);
        QMessageBox::warning(nullptr, u8"错误", u8"错误: 解析失败位置：" + QString::number(error.offset) + error.errorString());
        file.close();
        return;
    }

    // 处理 JSON 数据
    QJsonObject jsonObj = jsonDoc.object();

    // if(key == u8"1.动调配置"){
    //     QJsonObject subObj = jsonObj[key].toObject();
    //     // 读取筛选条件
    //     filterCondition = subObj[u8"筛选条件"].toObject();

    //     // 读取对应关系
    //     columnMapping = subObj[u8"对应关系"].toObject();

    //     // 读取测试用例模板配置
    //     QJsonObject caseTemplateConfig = subObj[u8"测试用例模板配置"].toObject();
    //     caseNumberColumn = caseTemplateConfig[u8"用例编号列"].toInt();
    //     caseTitleColumn = caseTemplateConfig[u8"用例标题列"].toInt();
    //     testStepColumn = caseTemplateConfig[u8"测试步骤列"].toInt();
    //     expectResultColumn = caseTemplateConfig[u8"期望结果列"].toInt();
    //     caseVersionColumn = caseTemplateConfig[u8"用例版本列"].toInt();

    //     // 读取现场测试用例模版配置
    //     QJsonObject templateConfigMapping = subObj[u8"现场用例模版配置"].toObject();
    //     headRowHeightArray = templateConfigMapping[u8"表头行高配置"].toArray();
    //     tailRowHeightArray = templateConfigMapping[u8"表尾行高配置"].toArray();
    //     colWidthArray = templateConfigMapping[u8"列宽配置"].toArray();
    //     singleTextHeight = templateConfigMapping[u8"单行文本行高"].toInt();
    //     charactorCountPerLine = templateConfigMapping[u8"单行文本字符数"].toInt();
    //     prepareArray = templateConfigMapping[u8"前提条件位置"].toArray();
    //     logPosArray = templateConfigMapping[u8"测试日志位置"].toArray();
    // }

    // if(key == u8"2.SAT配置"){
    //     QJsonObject subObj = jsonObj[key].toObject();
    //     // 读取筛选条件
    //     filterCondition = subObj[u8"筛选条件"].toObject();


    //     // 读取对应关系
    //     columnMapping = subObj[u8"对应关系"].toObject();

    //     // 读取测试用例模板配置
    //     QJsonObject caseTemplateConfig = subObj[u8"测试用例模板配置"].toObject();
    //     caseNumberColumn = caseTemplateConfig[u8"用例编号列"].toInt();
    //     caseTitleColumn = caseTemplateConfig[u8"用例标题列"].toInt();
    //     testStepColumn = caseTemplateConfig[u8"测试步骤列"].toInt();
    //     expectResultColumn = caseTemplateConfig[u8"期望结果列"].toInt();
    //     caseVersionColumn = caseTemplateConfig[u8"用例版本列"].toInt();

    //     // 读取现场测试用例模版配置
    //     QJsonObject templateConfigMapping = subObj[u8"现场用例模版配置"].toObject();
    //     headRowHeightArray = templateConfigMapping[u8"表头行高配置"].toArray();
    //     tailRowHeightArray = templateConfigMapping[u8"表尾行高配置"].toArray();
    //     colWidthArray = templateConfigMapping[u8"列宽配置"].toArray();
    //     singleTextHeight = templateConfigMapping[u8"单行文本行高"].toInt();
    //     charactorCountPerLine = templateConfigMapping[u8"单行文本字符数"].toInt();
    //     prepareArray = templateConfigMapping[u8"前提条件位置"].toArray();
    //     logPosArray = templateConfigMapping[u8"测试日志位置"].toArray();
    // }

    QJsonObject subObj = jsonObj[key].toObject();
    // 读取筛选条件
    filterCondition = subObj[FILTER_CONDITION_KEY].toObject();


    // 读取对应关系
    columnMapping = subObj[RELEATION_MAP_KEY].toObject();

    // 读取特殊处理配置
    m_SpecialProcessConfig = subObj[INPUT_SPECIAL_PROCESS_KEY].toObject();

    // 读取测试用例模板配置
    // QJsonObject caseTemplateConfig = subObj[u8"测试用例模板配置"].toObject();
    // QJsonObject caseTemplateConfig = subObj[u8"测试用例模板配置"].toObject();
    // caseNumberColumn = caseTemplateConfig[u8"用例编号列"].toInt();
    // caseTitleColumn = caseTemplateConfig[u8"用例标题列"].toInt();
    // testStepColumn = caseTemplateConfig[u8"测试步骤列"].toInt();
    // expectResultColumn = caseTemplateConfig[u8"期望结果列"].toInt();
    // caseVersionColumn = caseTemplateConfig[u8"用例版本列"].toInt();
    // testLocationColumn = caseTemplateConfig[u8"测试地点列"].toInt();
    // isaPhaseColumn = caseTemplateConfig[u8"ISA阶段列"].toInt();
    // testTypeColumn = caseTemplateConfig[u8"实验类型列"].toInt();

    // 读取生成文件模版配置
    generateFileTemplateConfigMapping = subObj[GENERATION_FILE_TEMPLATE_KEY].toObject();
    // headRowHeightArray = generateFileTemplateConfigMapping[HEADER_ROW_HEIGHT_KEY].toArray();
    // tailRowHeightArray = generateFileTemplateConfigMapping[TAIL_ROW_HEIGHT_KEY].toArray();
    // colWidthArray = generateFileTemplateConfigMapping[COLUMN_WIDTH_KEY].toArray();
    singleTextHeight = generateFileTemplateConfigMapping[SINGLE_ROW_TEXT_HEIGHT_KEY].toInt();
    charactorCountPerLine = generateFileTemplateConfigMapping[SINGLE_ROW_CHAR_SIZE_KEY].toInt();
    prepareArray = generateFileTemplateConfigMapping[PRE_CONDITION_POSITION_KEY].toArray();
    logPosArray = generateFileTemplateConfigMapping[LOG_POSITION_KEY].toArray();

    // 读取索引表配置
    m_IndexSheetConfig = subObj[INDEX_SHEET_KEY].toObject();

    file.close();
}



QJsonArray ConfigReader::getPreparePos()
{
    return prepareArray;
}

QJsonObject ConfigReader::getIndexSheetConfig()
{
    return m_IndexSheetConfig;
}

QJsonObject ConfigReader::getGenerateFileTemplateConfig()
{
    return generateFileTemplateConfigMapping;
}

QJsonArray ConfigReader::getInputSpecialProcessConfig(const QString& processName)
{
    return m_SpecialProcessConfig[processName].toArray();
}

QStringList ConfigReader::getSpecialColList()
{
    QStringList keys = m_SpecialProcessConfig.keys();
    QStringList res;
    for(auto const& key : std::as_const(keys)) {
        QJsonArray tArr = m_SpecialProcessConfig[key].toArray();

        for(auto const& each : std::as_const(tArr)) {
            res.append(QString::number(each.toInt()));
        }
    }
    return res;
}

// int ConfigReader::getCaseNumberColumn()
// {
//     return caseNumberColumn;
// }

// int ConfigReader::getCaseTitleColumn()
// {
//     return caseTitleColumn;
// }

// int ConfigReader::getTestStepColumn()
// {
//     return testStepColumn;
// }

// int ConfigReader::getExpectResultColumn()
// {
//     return expectResultColumn;
// }

// int ConfigReader::getCaseVersionColumn()
// {
//     return caseVersionColumn;
// }

// int ConfigReader::getTestLocationColumn()
// {
//     return testLocationColumn;
// }

// int ConfigReader::getIsaPhaseColumn()
// {
//     return isaPhaseColumn;
// }

// int ConfigReader::getTestTypeColumn()
// {
//     return testTypeColumn;
// }

// int ConfigReader::getConfigColumn(QString configName, int index)
// {
//     QJsonArray tArr = m_IndexSheetConfig[configName].toArray();
//     return tArr[index].toInt();
// }

// QJsonObject ConfigReader::getCaseTemplateConfig()
// {
//     return caseTemplateConfig;
// }


// QJsonArray ConfigReader::getHeadRowHeight()
// {
//     return headRowHeightArray;
// }

// QJsonArray ConfigReader::getTailRowHeight()
// {
//     return tailRowHeightArray;
// }

// QJsonArray ConfigReader::getColWidth()
// {
//     return colWidthArray;
// }

QJsonArray ConfigReader::getLogPos()
{
    return logPosArray;
}


QJsonObject ConfigReader::getColumnMapping()
{
    return columnMapping;
}

int ConfigReader::getSingleTextHeight()
{
    return singleTextHeight;
}

int ConfigReader::getCharactorCountPerLine()
{
    return charactorCountPerLine;
}

QJsonObject ConfigReader::getFilterCondition()
{
    return filterCondition;
}
